// 1. 复制数组：将原数组按旋转顺序复制到新数组，再整体拷贝回原数组。

// step 1# 旋转数组函数，将数组元素向右移动 k 位
void rotate(int* nums, int numsSize, int k) {
    // step 2# 分配同样大小的新数组用于存储旋转结果
    int *numsCopy = (int *)malloc(sizeof(int) * numsSize);  // 申请辅助数组

    int count = 0;  // 记录写入 numsCopy 的元素个数

    // step 3# 对 k 取模，避免超过数组长度导致越界
    k %= numsSize;  // 合理化旋转位数

    // step 4# 计算旋转后的起始下标（确保非负）
    int start = (numsSize - k) % numsSize;  // 从该下标开始“右移”写入

    // step 5# 按顺序将旋转后的元素填入 numsCopy
    for (int i = start; count < numsSize; i = (i + 1) % numsSize) {
        numsCopy[count++] = nums[i];  // 写入新数组
    }

    // step 6# 将 numsCopy 中结果拷贝回原数组 nums
    for (int i = 0; i < numsSize; i++) {
        nums[i] = numsCopy[i];  // 恢复到原数组中
    }

    // step 7# 释放辅助数组内存
    free(numsCopy);  // 防止内存泄漏
}


// 2. 先整体反转数组，再分别反转前 k 和后 n-k 部分，实现旋转效果。

// step 1# 主函数：将数组元素向右旋转 k 次
void rotate(int* nums, int numsSize, int k) {
    k %= numsSize;  // 对 k 取模，避免多余轮转（k > numsSize 时仍有效）

    // step 2# 翻转整个数组
    reverse(nums, 0, numsSize - 1);  // 将整个数组倒置

    // step 3# 翻转前 k 个元素
    reverse(nums, 0, k - 1);  // 将前 k 个元素倒置（还原顺序）

    // step 4# 翻转后 n-k 个元素
    reverse(nums, k, numsSize - 1);  // 将后面 n-k 个元素倒置
}

// step 5# 辅助函数：反转 nums[i..j] 区间内的元素
void reverse(int* nums, int i, int j) {
    while (i < j) {
        int temp = nums[i];       // 交换左右元素
        nums[i] = nums[j];        // 左 ↔ 右
        nums[j] = temp;
        i++;                      // 移动左指针
        j--;                      // 移动右指针
    }
}
